/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tiralabra;
import java.io.*;
import java.util.*;
/**
 *
 * @author semi
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        short leveys;
        short korkeus;
        String tiedosto = args[0]; // parametri 1: karttatiedosto
        short alkuX = Short.parseShort(args[1]); // parametri 2: lähtöpisteen x
        short alkuY = Short.parseShort(args[2]); // parametri 3: lähtöpisteen y
        short maaliX = Short.parseShort(args[3]); // parametri 4: maalipisteen x
        short maaliY = Short.parseShort(args[4]); // parametri 5: maalipisteen y
        int algoritmi = Integer.parseInt(args[5]); // parametri 6: algoritmivalinta, 1= astar 2=dijkstra
        String tulostusTiedosto = args[6];         // parametri 7, tulostustiedoston nimi
        Scanner lukija;
        String rivi;
        char[] rivitaulu;
        Keko keko;
        boolean onnistuiko;
        
        //TODO otetaan karttatiedosto komentoriviparametrina

        if (algoritmi !=1 && algoritmi !=2) {
            System.out.println("Algoritmi 1 = Astar, 2 = Dijkstra. Yritäpä uudelleen!");
            return;
        }

        try {
            lukija = new Scanner(new File (tiedosto));
        }
        catch (Exception e) {
            System.out.println("Tiedoston avaaminen ei onnistunut!");
            return; //lopetetaan
        }

        if(!lukija.hasNextShort()) {
            System.out.println("Tiedosto on väärässä formaatissa. Ei löytynyt taulukon leveyttä.");
            return;
        }
        leveys = lukija.nextShort();

        if(!lukija.hasNextShort()) {
            System.out.println("Tiedosto on väärässä formaatissa. Ei löytynyt taulukon korkeutta.");
            return;
        }
        korkeus = lukija.nextShort();

        Ruutu[][] kartta = new Ruutu[leveys][korkeus];
        // taulukko ruutu-olioista luodaan tässä
        
        for(int i=0; i < korkeus; i++) {
            try {
                 rivi = lukija.next(); //tarkista tämä
            }
            catch (Exception e) {
                System.out.println("Reisille ment, lopetan");
                return;
            }
            rivitaulu = rivi.toCharArray();
            for(int j=0; j < leveys; j++) {
               /*
                * # = este
                * _ = saa mennä
                * A = alkusolmu
                * M = maalisolmu
                * x = reitti
                */
                /*System.out.println("j = " +j); DEBUG */
                if (rivitaulu[j] == '#') {
                    kartta[j][i] = new Ruutu(false);
                } else if (rivitaulu[j] == '_') {
                    kartta[j][i] = new Ruutu(true);
                } else {
                    System.out.println("Virheellinen taulukko, lopetan");
                    return;
                }

            }
        }
        lukija.close();

        //luodaan keko algoritmin käyttöön
        if (algoritmi == 1) {
            keko = new Akeko(leveys*korkeus);
        } else {
            keko = new Dkeko(leveys*korkeus);

        }

        //laitetaan kello päälle
        long alkuAika = System.currentTimeMillis();
        if (algoritmi==1) {
            onnistuiko = Astar.etsiReitti(kartta, alkuX, alkuY, maaliX, maaliY, keko, leveys, korkeus);
        } else {
            onnistuiko = Dijkstra.etsiReitti(kartta, alkuX, alkuY, maaliX, maaliY, keko, leveys, korkeus);
        }

        long loppuAika = System.currentTimeMillis();
        long aika = loppuAika - alkuAika;

        if (onnistuiko) {
            System.out.println("Sopiva reitti löytyi ajassa "+aika);
            // nyt on reitti
        } else {
            System.out.println("Ei löydetty sopivaa reittiä");
            return;
        }

        short tempX = maaliX;
        short temptempX;
        short tempY = maaliY;

        while(tempX != alkuX || tempY != alkuY) {
            /* DEBUG System.out.println("tempX = "+tempX);
            System.out.println("tempY = "+tempY); */
            kartta[tempX][tempY].valitulleReitille();
            temptempX = kartta[tempX][tempY].haeVanhemmanx();
            tempY = kartta[tempX][tempY].haeVanhemmany();
            tempX = temptempX;
            /* merkitään valittu reitti taulukkoon */
        }

        /*
         * Kirjoitetaan tiedostoon
         */
        boolean onnistuikoTulostus;
        File loppuKartta = new File(tulostusTiedosto);
        try {
            onnistuikoTulostus = loppuKartta.createNewFile();
            PrintWriter tulostin = new PrintWriter(loppuKartta);
 
            //Kirjoitetaan varsinainen kartta.
            for (int i = 0; i < korkeus; i++) {
                for (int j = 0; j < leveys; j++) {
                    if (maaliX == j && maaliY == i) {
                        tulostin.print('M');
                    } else if (alkuX == j && alkuY == i) {
                        tulostin.print('A');
                    } else if (!kartta[j][i].onkoKuljettava()) {
                         tulostin.print('#');
                    } else if (kartta[j][i].onkoValittu()) {
                         tulostin.print('x');
                    } else {
                        tulostin.print('_');
                    }
                }
                tulostin.print("\n");
            }
            tulostin.close();

        } catch(Exception e) {
            onnistuikoTulostus = false;
        }
        if (!onnistuikoTulostus) {
            System.out.println("Ei saatu tehtyä uutta tiedostoa kartalle, lopetan");
            return;
        }

    }

        //TODO profit

}
